/*
 * Carlos René Michel Morales
 * 
 * Clase para realizar la conexión a la API de Twitter
 * 
 */

package piticli.twitter;

//import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.*;
import org.json.*;

/**
 *
 * @author Rene
 */
public class TwitterConnection {
    
    private String username_or_email;
    private String password;
    private int responseCode;

    public TwitterConnection(String username_or_email, String password){
        this.username_or_email = username_or_email;
        this.password = password;
    }
    
    public String getUsername_or_email() {
        return username_or_email;
    }

    public void setUsername_or_email(String username_or_email) {
        this.username_or_email = username_or_email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    /**
     * 
     * @param max_tweets Numero maximo de Tweets a obtener
     * @return Regresa un ArrayList con la lista de tweets, regresa null si no se puede obtener la lista
     * @throws org.json.JSONException
     */
    public ArrayList getHomeTimeline(int max_tweets) throws JSONException{
        
        ArrayList tweets = new ArrayList(max_tweets);
        
        //Nos conectamos con el servidor y mandamos credenciales por medio de autentificacion basica HTTP
        Connection conn = new Connection();
        String response = new String();
        try {
            response = conn.basicAuthConnection(this.username_or_email, this.password, "http://twitter.com/statuses/friends_timeline.json?count="+max_tweets);
        } catch (Exception ex) {
            System.out.println("Error en la conexion: No se pueden obtener datos");
            return null;
        }
        
        //La respuesta del sitio es un archivo json el se parsea para ser leído
        JSONTokener tokener = new JSONTokener(response);
        JSONArray jsonArray = new JSONArray(tokener);
        JSONObject obj = new JSONObject();
        
        Tweet tweet = new Tweet();
    
        //Se barre en todo el Arreglo y se va agregando cada tweet a la lista
        for(int i=0;i<jsonArray.length();i++)
        {
            obj = jsonArray.getJSONObject(i);
            tweet = Tweet.getTweetFromJSONObject(obj);
            
            tweets.add(tweet);
        }
        return tweets;
    }
    /**
     * Esta función se usa para obtener el timeline de un usuario específico. Se usa autorización para accesar
     * a las cuentas protegidas. Si la persona tiene su cuenta protegida y no te ha aceptado como amigo se regresará un null
     * 
     * @param max_tweets Número máximo de tweets que se regresarán. Limite = 200
     * @param screen_name El nombre de usuario de la cuenta de Twitter a la cual se accesará
     * @return Se regresa un ArrayList conteniendo los objetos Tweets que se obtuvieron de la cuenta especificada
     * @throws org.json.JSONException
     */
    public ArrayList getUserTimeline(int max_tweets, String screen_name) throws JSONException {
        
        ArrayList tweets = new ArrayList(max_tweets);
        
         //Nos conectamos con el servidor y mandamos credenciales por medio de autentificacion basica HTTP
        Connection conn = new Connection();
        String response = new String();
        try {
            response = conn.basicAuthConnection(this.username_or_email, this.password, "http://twitter.com/statuses/user_timeline/"+screen_name+".json?count="+max_tweets);
        } catch (Exception ex) {
            System.out.println("Error en la conexion: No se pueden obtener datos");
            return null;
        }
        
        //La respuesta del sitio es un archivo json el se parsea para ser leído
        JSONTokener tokener = new JSONTokener(response);
        JSONArray jsonArray = new JSONArray(tokener);
        JSONObject obj = new JSONObject();
        
        Tweet tweet = new Tweet();
    
        //Se barre en todo el Arreglo y se va agregando cada tweet a la lista
        for(int i=0;i<jsonArray.length();i++)
        {
            obj = jsonArray.getJSONObject(i);
            tweet = Tweet.getTweetFromJSONObject(obj);
            
            tweets.add(tweet);
        }
        return tweets;
    }
    
    /**
     * Funcion para hacer actualizar el estado en Twitter, se requiere autentificación
     * @param status String con el texto que se posteara
     * @return se regresa un objeto Tweet con los datos del post que se acaba de hacer
     * @throws java.io.UnsupportedEncodingException
     * @throws org.json.JSONException
     */
    public Tweet postTweet(String status) throws UnsupportedEncodingException, JSONException{
        
         //Nos conectamos con el servidor y mandamos credenciales por medio de autentificacion basica HTTP
        Connection conn = new Connection();
        String response = new String();
        
        //Codificamos la variable post con el status y se hace el POST
        status = URLEncoder.encode("status", "UTF-8") + "=" + URLEncoder.encode(status, "UTF-8");
        try {
            response = conn.postWithBasicAuthConnection(this.username_or_email, this.password, "http://twitter.com/statuses/update.json",status);
        } catch (Exception ex) {
            System.out.println("Error en la conexion: No se pudo realizar la conexión");
            return null;
        }
        
        //Se guarda el codigo de respuesta
        this.responseCode = conn.getResponseCode();
        //La respuesta del sitio es un archivo json el se parsea para ser leído
        JSONTokener tokener = new JSONTokener(response);
        JSONObject obj = new JSONObject(tokener);
       
        return Tweet.getTweetFromJSONObject(obj);
    }

    /**
     * Funcion para obtener un entero con el código de respuesta de la conexión
     * 200 OK
     * 401 Prohibido
     * 404 No existe
     * ...
     * @return un int con el codigo que regresa el sitio
     */
    public int getResponseCode() {
        return responseCode;
    }
}
